2020年11月29日
Jerry
6028
2021年1月13日
基本所有的软件都会有自动更新功能,方便解决其中的bug或增添新功能,那自动更新是如何实现的呢?这篇文章开始记录下自己实现的自动更新器。
升级的流程图思路大概如下:
流程图很清楚,接下来搞定具体的实现。
为了直观地实现其中的每一步,我搞了个界面和多个按钮,模拟其中的一步步操作。
升级前先准备好升级XML文件以及升级压缩包:
1、准备好升级的文件,压缩打包并计算出MD5供下载后的校验,随后上传到服务器。我这里压缩包(newfile.zip)就只有一个txt文档,升级的服务器用了网站的CDN服务器。
2、新建了一个XML文件testupdate.xml,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Update>
<Soft Name="update">
<Verson>1.0.0.3</Verson>
<DownLoad>https://cdn2.jerrycoding.com/newfile.zip</DownLoad>
<Md5>9c12161031c2ec9b3c010d945c495ad7</Md5>
</Soft>
</Update>
组成部分一目了然:1)version(字母写错了 已经上传了就懒得改了);2)升级包文件下载地址;3)升级包MD5校验。
当然你可以根据需要随意修改你的XML文件,这里我就以这个简单示例。
3、下载升级XML文件
/// <summary>
/// 下载xml文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string url = textBox1.Text;
WebClient client = new WebClient();
richTextBox1.AppendText("开始下载XML...");
try
{
g_upxmlname = System.IO.Path.GetFileName(url);
client.DownloadFile(url, System.Environment.CurrentDirectory + "\\" + g_upxmlname);
richTextBox1.AppendText("\n下载XML完成!");
}
catch (Exception ex)
{
richTextBox1.AppendText("\n下载失败,错误" + ex.Message);
}
}
实现效果:
4、解析下载后的升级文件
/// <summary>
/// XML 解析
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
//解析 下载 XML
XmlDocument doc = new XmlDocument();
doc.Load(System.Environment.CurrentDirectory + "\\" + g_upxmlname);
XmlElement root = null;
root = doc.DocumentElement;
XmlNodeList nodeList = null;
nodeList = root.SelectNodes("/Update/Soft");
foreach (XmlElement el in nodeList)//读元素值
{
List<String> strlist = new List<String>();
richTextBox1.AppendText("\n下载的xml内容:");
foreach (XmlNode node in el.ChildNodes)
{
richTextBox1.AppendText("\n" + node.Name + ":" + node.InnerText);
strlist.Add(node.InnerText);
}
g_upxml.version = strlist[0];
g_upxml.url = strlist[1];
g_upxml.md5 = strlist[2];
}
//解析 本地XML
doc.Load(System.Environment.CurrentDirectory + "\\" + g_localxmlname);
root = doc.DocumentElement;
nodeList = root.SelectNodes("/Local/Soft");
foreach (XmlElement el in nodeList)//读元素值
{
List<String> strlist = new List<String>();
foreach (XmlNode node in el.ChildNodes)
{
richTextBox1.AppendText("\n本地xml内容:\n" + node.Name + ":" + node.InnerText);
strlist.Add(node.InnerText);
}
g_loxml.version = strlist[0];
}
}
/// <summary>
/// 版本号比较
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
richTextBox1.AppendText("\n本地版本号:" + g_loxml.version);
richTextBox1.AppendText("\n待升级版本号:" + g_upxml.version);
if (g_loxml.version == g_upxml.version)
{
richTextBox1.AppendText("\n版本号一致,无需升级!");
return;
}
else
{
richTextBox1.AppendText("\n版本号校验完成,需要升级!");
return;
}
}
其中定义了个结构体,保存下解析出的版本号、下载路径及Md5
private struct MyXml_S
{
public string version;
public string url;
public string md5;
};
MyXml_S g_upxml;
MyXml_S g_loxml;
实现效果:
到这就基本完成了XML文件的解析与版本号的校验。
实现代码 GITHUB: https://github.com/DreamerLS1994/autoupdater
原创文章,转载请注明出处:
https://jerrycoding.com/article/csharp-autoupdate1
微信
支付宝